# Название сервиса
Актуализация справочника адресов

## Краткое описание
Сервис предназначен для поддержания адресного справочника в актуальном состоянии. 
Данные скачиваются с сайта ИФНС и содержат Государственный Адресный Реестр(ГАР).
После скачивания даные загружаются в таблицы базы данных Oracle либо PostgreSQL.
В дальнейшем к данным должен предоставляться доступ на чтение по аналогии с формой:
https://fias.nalog.ru/Search

## Алгоритм работы
При запуске проверяет наличие новой версии данных на сайте ИФНС. Описания данных и порядок выгрузки описан по ссылке:  https://fias.nalog.ru/Updates. Данные могут быть в виде полного архива (~39ГБ на 01.01.2023) или в виде дельт (до ~1 ГБ). Дельта данные - это новые, изменившиеся и удаленные данные, появившиеся с момента предыдущей выгрузки базы ФИАС.

Выбор режима обработки дельт или полного архива выставляется параметром запуска "b"(Bootstrap).
Приложение планируется запускать с помощью "cron". Дельты рекомендуется опрашивать каждый день,
а полный архив можно запускать раз в месяц или еще реже (скачивание около 7ч, парсинг архива и заливка в бд - еще около 9ч).

Приложение само отслеживает наличие своего запущенного экземпляра в памяти и прерывает работу, если при запуске его обнаружит.

При наличии параметра "b" будет скачан полный архив, заново созданы таблицы и индексы в базе данных.
Если параметр "b" не будет задан, программа будет скачивать дельты и добавлять данные в ранее созданные таблицы, проверки на наличие таблиц в этом режиме пока не предусмотрено.

Описания таблиц, необходимые для создания и обновления структуры, хранятся в файле "XSD схемы выгрузки БД в формате ГАР", который доступен по адресу: https://fias.nalog.ru/docs/gar_schemas.zip. 
Данный файл скачивается во временную папку в первую очередь. Далее сервис проверяет, не изменился ли он,
и, в случае изменения, сообщает об этом  разработчику (пока не реализовано). Если были структурные изменения, нужно исправлять связанные сервисы.

При запуске сервис парсит файлы XSD схем и использует полученные структуры таблиц в дальнейшей работе.
В параметрах запуска также указывается в какую СУБД будут выгружаться данные. 
Возможно 2 варианта - Oracle и PostgreSQL. Настройки подключения к СУБД хранятся в ini-файле сервиса.
Номер загруженной версии по окончанию загрузки записывается в ini-файл сервиса.

Если при выгрузке дельты удаляемых данных нет за выгружаемый период, то файлы не создаются.
На стороне пользователя, после загрузки базы ФИАС в локальную базу данных, из нее по ключевым полям должны удаляться записи,  присутствующие в таблицах, технологически удаленных данных.

#### Дельта данные загружаются по следующему алгоритму: 
1. По наличию или отсутствию ключа в пользовательской базе определяется тип операции – добавление или обновление записи.
2. После проведения соответствующих операций необходимо удалить по ключу записи, присутствующие в таблицах технологически удаленных данных. 
Выборочная проверка нескольких дельт не обнаружила наличия таких файлов, поэтому удаление по ключу будет реализовано позднее.


Префиксы имён файлов выгрузки и имена файлов XSD схем файлов выгрузки по технологически удалённым из БД ФИАС адресным сведениям приводятся в таблице:

| Назначение файла выгрузки | Префикс имени файла выгрузки | Имя файла  XSD схемы файла выгрузки |
| ------ | ------ | ------ |
|Удалённые записи по адресообразующим элементам | AS_DEL_ADDROBJ | AS_ADDROBJ_2_250_01_04_01_01.xsd | 
|Удалённые записи с номерами домов улиц городов и населенных пунктов | AS_DEL_HOUSE | AS_HOUSE_2_250_02_04_01_01.xsd | 
|Удалённые сведения по нормативным документам | AS_DEL_NORMDOC | AS_NORMDOC_2_250_05_04_01_01.xsd | 
|Удалённые сведения по земельным участкам | AS_DEL_STEAD | AS_STEAD_2_250_16_04_01_01.xsd | 
|Удаленные сведения по помещениям | AS_DEL_ROOM | AS_ROOM_2_250_17_04_01_01.xsd | 

**Структура полного архива и дельт идентична и состоит из следующих файлов и папок:**

```sh
01
02
...
99
AS_APARTMENT_TYPES_20230112_1801f4b9-b57c-4bae-bee7-d7a8440a91c6.XML
AS_ADDR_OBJ_TYPES_20230112_e9466f3a-c9da-49a9-a723-a4f1632d5662.XML
AS_ROOM_TYPES_20230112_98988897-eb5f-4d80-9e0e-3c96e2ac2aa9.XML
AS_OPERATION_TYPES_20230112_d45ea244-3514-46d7-b8b5-36fe7bb905e3.XML
AS_PARAM_TYPES_20230112_c4603dfb-f571-4c13-bb18-3264f1639024.XML
AS_HOUSE_TYPES_20230112_50abdace-beb7-40f7-a67d-d77faead176b.XML
AS_ADDHOUSE_TYPES_20230112_1b2bc375-4d26-46fa-8321-57660ec281b7.XML
AS_OBJECT_LEVELS_20230112_0395571c-c062-4474-9705-ee5ddc0cc679.XML
AS_NORMATIVE_DOCS_TYPES_20230112_7ca440de-4ba0-4c85-ba0c-e34fe2bae464.XML
AS_NORMATIVE_DOCS_KINDS_20230112_5c02a577-7c61-4a04-8b36-8281d393d4e8.XML
```

где 01..99 - папки со следующими файлами:
```sh
AS_ADDR_OBJ_20230112_60836aae-0c0f-4a9d-94f1-e09.XML
AS_ADDR_OBJ_DIVISION_20230112_f70984e1-bc8c-4327.XML
AS_ADDR_OBJ_PARAMS_20230112_c3ec1c14-af22-466a-b.XML
AS_ADM_HIERARCHY_20230112_2bc9e69e-97e1-4fb5-ac5.XML
AS_APARTMENTS_20230112_d2fc01b2-9072-4800-94d9-8.XML
AS_APARTMENTS_PARAMS_20230112_ea8b564e-986c-4fa7.XML
AS_CARPLACES_20230112_ba315dd9-d768-46ca-99b8-b7.XML
AS_CARPLACES_PARAMS_20230112_48d1de06-6149-4521-.XML
AS_CHANGE_HISTORY_20230112_9137a82e-d5f6-4e4c-90.XML
AS_HOUSES_20230112_cef4d656-178f-409d-87c1-d42e0.XML
AS_HOUSES_PARAMS_20230112_58f619d1-8d7a-4489-a01.XML
AS_MUN_HIERARCHY_20230112_72a85681-cd0d-4350-9bb.XML
AS_NORMATIVE_DOCS_20230112_92bdde4b-13f4-481a-a4.XML
AS_REESTR_OBJECTS_20230112_a2de19ce-da29-4566-a7.XML
AS_ROOMS_20230112_f85de51b-9193-41c0-8e8a-bd664d.XML
AS_ROOMS_PARAMS_20230112_256d29f3-57e2-4e9c-8a24.XML
AS_STEADS_20230112_7db137ce-3bcc-4fd9-9d65-6a170.XML
AS_STEADS_PARAMS_20230112_5f41f3a5-8c20-4816-b64.XML
```

Сервис представляет из себя единое приложение, написанное на Object Pascal и собранное компилятором fpc, поставляемым с Lazarus. 
Сборка приложения и его запуск целесообразно осуществляеть на Linux-сервере, предоставленном сответмтвующей службой предприятия. 
Разработка и отладка возможна как на ОС Linux, так и в MS Windows.

